﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;
using System.Text;
using System.Drawing;
using System.ComponentModel;
using Noris.Tools.FrxEditor.Editor;
using Noris.Tools.FrxEditor.Components;
using Noris.Tools.FrxEditor.ComponentsLayer;

namespace Noris.Tools.FrxEditor.Data
{
    /// <summary>
    /// Svazek prvků v jednom místě sestavy.
    /// Záhlaví (stránky, skupiny, sloupce), detail, zápatí...
    /// </summary>
    public partial class ReportBand : IPropertyOpenForm
    {
        #region Konstrukce
        /// <summary>
        /// Inicializuje datové property
        /// </summary>
        protected void InitDataProperty()
        {
            this.ReportData = new ReportData();
        }
        /// <summary>
        /// Datový zdroj pro tuto část reportu.
        /// Každý svazek (band) má svoji část, která nikdy není null.
        /// Může být prázdná.
        /// </summary>
        [Category("Data")]
        [DisplayName("Zdroj dat")]
        [Description("Datový zdroj pro tuto část")]
        [Editor(typeof(PropertyEditorOpenForm), typeof(System.Drawing.Design.UITypeEditor))]
        public ReportData ReportData { get; private set; }
        /// <summary>
        /// Metoda vrátí názvy datových zdrojů dostupných v tomto Bandu (najde datové zdroje odsud až k parentovi).
        /// Výsledný seznam se používá v PropertyGridu.
        /// </summary>
        /// <returns></returns>
        public IEnumerable<string> GetAvailableDataTables()
        {
            List<string> result = new List<string>();
            result.Add(this.HeaderText);
            ReportBand ownerBand = this.OwnerBand;
            if (ownerBand != null)
                result.AddRange(ownerBand.GetAvailableDataTables());
            return result;
        }
        /// <summary>
        /// Metoda vrátí názvy sloupců v daném datovém zdroji, z nichž je možno vybírat
        /// </summary>
        /// <param name="dataSource"></param>
        /// <returns></returns>
        public IEnumerable<string> GetAvailableDataColumn(string dataSource)
        {
            return this.GetAvailableDataColumn(dataSource, null);
        }
        /// <summary>
        /// Metoda vrátí názvy sloupců v daném datovém zdroji, z nichž je možno vybírat
        /// </summary>
        /// <param name="dataSource"></param>
        /// <param name="predicate"></param>
        /// <returns></returns>
        public IEnumerable<string> GetAvailableDataColumn(string dataSource, Func<string, bool> predicate)
        {
            if (String.IsNullOrEmpty(dataSource)) return null;
            return new string[] { "cislo_subjektu", "reference_subjektu", "nazev_subjektu", "cislo_poradace", "datum_vzniku" };
        }
        #endregion
        #region Načítání dat
        /// <summary>
        /// Zajistí načtení a vrácení dat pro tento svazek.
        /// Pokud tento svazek nepracuje s vlastními daty, vrátí null.
        /// </summary>
        /// <param name="paramValue"></param>
        /// <returns></returns>
        internal SimpleDataTable LoadData(ReportParamValue paramValue)
        {
            return this.ReportData.LoadData(paramValue);
        }
        #endregion
        #region Serializace dat
        /// <summary>
        /// Zajistí uložení datové části Bandu do XML elementu
        /// </summary>
        /// <param name="node"></param>
        private void XmlSerializeDataTo(XElement node)
        {
            this.ReportData.XmlSerializeDataTo(node);
        }
        /// <summary>
        /// Zajistí načtení datové části Bandu z XML elementu
        /// </summary>
        /// <param name="node"></param>
        /// <param name="overrideId"></param>
        private void XmlFillDataFrom(XElement node, bool overrideId)
        {
            this.ReportData.XmlFillDataFrom(node, overrideId);
        }
        #endregion
        #region IPropertyOpenForm Members
        void IPropertyOpenForm.PropertyGridOpenForm(System.ComponentModel.ITypeDescriptorContext context, object value)
        {
            switch (context.PropertyDescriptor.Name)
            {
                case "ReportData":
                    this.ReportData.ShowSettings();
                    break;
            }
        }
        #endregion
    }
}
